001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Feb 14, 2003 005 * Time: 7:44:18 PM 006 */ 007 008 package EVolve.visualization.XYViz.RefRefViz; 009 010 import EVolve.visualization.*; 011 import EVolve.Scene; 012 import EVolve.exceptions.NoDataPlotException; 013 import EVolve.data.Entity; 014 import EVolve.util.painters.*; 015 import EVolve.util.painters.placements.*; 016 import javax.swing.*; 017 import java.awt.*; 018 import java.awt.event.*; 019 import java.util.*; 020 021 public class RelationshipViz extends CorrelationViz{ 022 protected static int SELECT_OPTION = SELECT_X_AXIS|SELECT_Y_AXIS; 023 private static JMenuItem selectionMenu[] = null; 024 private JTextField textThreshold; 025 private int threshold=10; 026 private ArrayList menuList; 027 private JMenuItem itemReArrange; 028 private JMenu menuChangePlacement; 029 private JMenuItem itemSelectX, itemSelectY; 030 private JComboBox comboPlacement; 031 private Placement selectedPlacement; 032 private Placement[] placementList; 033 034 public RelationshipViz() { 035 super(); 036 menuList = new ArrayList(); 037 } 038 039 private void createPlacements() { 040 placementList = new Placement[2]; 041 placementList[0] = new RectPlacement(10); 042 placementList[1] = new RoundPlacement(10); 043 selectedPlacement = placementList[0]; 044 } 045 046 protected Component createPanel() { 047 Component returnVal = super.createPanel(); 048 canvas.setPanelFlag(AxesPanel.Null); 049 canvas.setZoomingSize(50,50); 050 flipMagnifier = false; 051 addMagnifier(canvas,flipMagnifier); 052 053 return returnVal; 054 } 055 056 protected JPanel createConfigurationPanel() { 057 JPanel panelBottom = new JPanel(new GridLayout(2,2)); 058 059 panelBottom.add(new JLabel("Threshold: ")); 060 061 textThreshold = new JTextField(String.valueOf(threshold), 10); 062 panelBottom.add(textThreshold); 063 064 createPlacements(); 065 panelBottom.add(new JLabel("Placement: ")); 066 comboPlacement = new JComboBox(); 067 for (int i = 0; i < placementList.length; i++) { 068 comboPlacement.addItem(placementList[i].getName()); 069 } 070 panelBottom.add(comboPlacement); 071 072 JPanel configurationPanel = new JPanel(new FlowLayout()); 073 configurationPanel.add(panelBottom); 074 075 return configurationPanel; 076 } 077 078 protected void updateConfiguration() { 079 try { 080 threshold = Integer.parseInt(textThreshold.getText()); 081 selectedPlacement = placementList[comboPlacement.getSelectedIndex()]; 082 super.updateConfiguration(); 083 084 } catch (Exception e) { 085 Scene.showErrorMessage("Threshold must be an integer"); 086 configure(); 087 } 088 } 089 090 public void autoUpdateConfiguration(HashMap config) { 091 super.autoUpdateConfiguration(config); 092 threshold = ((Integer)config.get("Interval")).intValue(); 093 autoInterval = -1; 094 interval = -1; 095 if (config.get("Options")!=null) { 096 String equatorName = (String)config.get("Options"); 097 for (int i=0; i<placementList.length; i++) 098 if (placementList[i].getName().equals(equatorName)) { 099 selectedPlacement = placementList[i]; 100 comboPlacement.setSelectedIndex(i); 101 break; 102 } 103 } 104 } 105 106 public HashMap getCurrentConfigure() { 107 HashMap configure = super.getCurrentConfigure(); 108 109 configure.put("Interval", new Integer(threshold)); 110 configure.put("Options", selectedPlacement.getName()); 111 112 return configure; 113 } 114 115 protected void installPainter() { 116 painter = new RelationshipPainter(); 117 } 118 119 public void preVisualize() { 120 super.preVisualize(); 121 image = new AutoShapeImage(); 122 } 123 124 public void visualize() { 125 ((RelationshipPainter)painter).updatePainterParameters(value,threshold); 126 painter.paint(image,xAxis.getDataFilter().getTargetType(),yAxis.getDataFilter().getTargetType(),10); 127 sort(); 128 } 129 130 public void sort() { 131 try { 132 AutoImage sorted = image.getSortedImage(xAxis,yAxis); 133 selectedPlacement.categoritize(sorted, yAxis.getDataFilter().getTargetType()); 134 selectedPlacement.initialPlacement(sorted); 135 canvas.setImage(sorted.getImage()); 136 canvas.repaint(); 137 } catch (NoDataPlotException e) { 138 Scene.showErrorMessage(e.getMessage()); 139 } 140 } 141 142 public void mouseMove(int x, int y) { 143 int X = canvas.getImageX(x); 144 int Y = canvas.getImageY(y); 145 if (image != null) { 146 EVolve.util.painters.shapes.Shape entityShape = ((AutoShapeImage)image).getEntityShapes(X,Y); 147 if (entityShape != null) { 148 Entity entity; 149 if (entityShape.getEntityType() == xAxis.getDataFilter().getTargetType()) { 150 entity = xAxis.getEntityFromInt((int)entityShape.getEntityID()); 151 } else { 152 entity = yAxis.getEntityFromInt((int)entityShape.getEntityID()); 153 } 154 Scene.setStatus(entity.getName()); 155 } else 156 Scene.setStatus(" "); 157 } else { 158 Scene.setStatus(" "); 159 } 160 } 161 162 public Object clone() { 163 RelationshipViz o = (RelationshipViz)super.clone(); 164 165 o.menuList = new ArrayList(); 166 167 return o; 168 } 169 170 public JMenuItem[] createSelectionMenuItem() { 171 if (selectionMenu != null) return selectionMenu; 172 173 itemSelectX = new JCheckBoxMenuItem("Occurred Entities of Object One"); 174 itemSelectX.setMnemonic(KeyEvent.VK_O); 175 itemSelectX.addActionListener(new ActionListener() { 176 public void actionPerformed(ActionEvent e) { 177 boolean selected = itemSelectX.isSelected(); 178 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_X_AXIS); 179 } 180 }); 181 itemSelectX.setSelected(true); 182 183 itemSelectY = new JCheckBoxMenuItem("Occurred Entities of Object Two"); 184 itemSelectY.setMnemonic(KeyEvent.VK_T); 185 itemSelectY.addActionListener(new ActionListener() { 186 public void actionPerformed(ActionEvent e) { 187 boolean selected = itemSelectY.isSelected(); 188 SELECT_OPTION = switchOption(selected, SELECT_OPTION, SELECT_Y_AXIS); 189 } 190 }); 191 itemSelectY.setSelected(true); 192 193 selectionMenu = new JMenuItem[2]; 194 selectionMenu[0] = itemSelectX; 195 selectionMenu[1] = itemSelectY; 196 197 return selectionMenu; 198 } 199 200 public void makeSelection() { 201 if (SELECT_OPTION == 0) { 202 Scene.showErrorMessage("Nothing will be selected, please check Selection menu."); 203 return; 204 } 205 206 int x1 = canvas.getStartX(); 207 int x2 = canvas.getEndX(); 208 int y1 = canvas.getStartY(); 209 int y2 = canvas.getEndY(); 210 211 int[] selection = null; 212 HashMap entities = ((RelationshipPainter)painter).getEntitiesInBox(x1,y1,x2,y2); 213 int xComparator = xAxis.getSelectedComparatorIndex(), yComparator = yAxis.getSelectedComparatorIndex(); 214 xAxis.selectComparator(1); 215 yAxis.selectComparator(1); 216 switch (SELECT_OPTION & 0xf0f0) { 217 case SELECT_X_AXIS: // select occurred entities of object one 218 ArrayList idList = (ArrayList)entities.get(new Integer(xAxis.getDataFilter().getTargetType())) ; 219 selection = new int[idList.size()]; 220 for (int i=0; i<idList.size(); i++) { 221 selection[i] = ((Long)idList.get(i)).intValue(); 222 } 223 xAxis.makeSelection(subjectDefinition.getType(),selection); 224 break; 225 case 0x0000: // x axis is not seletcted 226 break; 227 } 228 229 switch (SELECT_OPTION & 0x0f0f) { 230 case SELECT_Y_AXIS: //select occurred entities of object two 231 ArrayList idList = (ArrayList)entities.get(new Integer(yAxis.getDataFilter().getTargetType())) ; 232 selection = new int[idList.size()]; 233 for (int i=0; i<idList.size(); i++) { 234 selection[i] = ((Long)idList.get(i)).intValue(); 235 } 236 yAxis.makeSelection(subjectDefinition.getType(),selection); 237 break; 238 case 0x0000: 239 break; 240 } 241 xAxis.selectComparator(xComparator); 242 yAxis.selectComparator(yComparator); 243 } 244 245 protected ArrayList createOptionalMenu() { 246 if (menuList.size() > 0) return null; 247 248 menuList.clear(); 249 itemReArrange = new JMenuItem("Rearrange"); 250 itemReArrange.setMnemonic(KeyEvent.VK_R); 251 itemReArrange.addActionListener(new ActionListener() { 252 public void actionPerformed(ActionEvent e) { 253 String newSize = (String)JOptionPane.showInputDialog(Scene.getFrame(), 254 "Input new threshold:", 255 "Rearrange", 256 JOptionPane.QUESTION_MESSAGE, null, null, String.valueOf(threshold)); 257 threshold = Integer.parseInt(newSize); 258 canvas.scaleImage(false); 259 sortValues(); 260 //((RelationshipPainter)painter).updatePainterParameters(value,threshold); 261 painter.paint(image,xAxis.getDataFilter().getTargetType(),yAxis.getDataFilter().getTargetType(),10); 262 sort(); 263 } 264 }); 265 266 menuChangePlacement = new JMenu("Change Placement"); 267 menuChangePlacement.setMnemonic(KeyEvent.VK_F); 268 for (int i = 0; i < placementList.length; i++) { 269 JMenuItem item = new JMenuItem(placementList[i].getName()); 270 item.addActionListener(new ActionListener() { 271 public void actionPerformed(ActionEvent e) { 272 for (int j=0; j<placementList.length; j++) { 273 if (placementList[j].getName().equals(((JMenuItem)e.getSource()).getActionCommand())) { 274 selectedPlacement = placementList[j]; 275 sort(); 276 break; 277 } 278 } 279 } 280 }); 281 menuChangePlacement.add(item); 282 } 283 menuList.add(itemReArrange); 284 menuList.add(menuChangePlacement); 285 return menuList; 286 } 287 288 private void sortValues() { 289 int newValues[][] = new int[value.length][value[0].length]; 290 291 for (int i=0; i<value.length; i++) { 292 for (int j=0; j<value[i].length; j++) { 293 int x, y; 294 x = xAxis.getSortedIndex(i); 295 y = yAxis.getSortedIndex(j); 296 if ((x!=-1)&&(y!=-1)) { 297 newValues[x][y] = value[i][j]; 298 } 299 } 300 } 301 302 ((RelationshipPainter)painter).updatePainterParameters(newValues,threshold); 303 } 304 305 public void updateMenu() { 306 super.updateMenu(); 307 itemChangeOrientation.setEnabled(false); 308 itemScale.setSelected(false); 309 } 310 }